/*
 * Copyright [2022] [https://www.xiaonuo.vip]
 *
 * Snowy采用APACHE LICENSE 2.0开源协议，您在使用过程中，需要注意以下几点：
 *
 * 1.请不要删除和修改根目录下的LICENSE文件。
 * 2.请不要删除和修改Snowy源码头部的版权声明。
 * 3.本项目代码可免费商业使用，商业使用请保留源码和相关描述文件的项目出处，作者声明等。
 * 4.分发源码时候，请注明软件出处 https://www.xiaonuo.vip
 * 5.不可二次分发开源参与同类竞品，如有想法可联系团队xiaonuobase@qq.com商议合作。
 * 6.若您的项目无法满足以上几点，需要更多功能代码，获取Snowy商业授权许可，请在官网购买授权，地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.biz.modular.goods.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import vip.xiaonuo.biz.modular.goods.entity.BizGoods;
import vip.xiaonuo.biz.modular.goods.param.ClientGoodsQryParam;
import vip.xiaonuo.biz.modular.goods.param.GoodsInfoParam;
import vip.xiaonuo.biz.modular.goods.param.GoodsQryDto;
import vip.xiaonuo.biz.modular.goods.result.ClientGoodsDetailResult;
import vip.xiaonuo.biz.modular.goods.result.ClientGoodsPageResult;
import vip.xiaonuo.biz.modular.goods.result.GoodsPageResult;
import vip.xiaonuo.biz.modular.goods.result.GoodsQuantityResult;
import vip.xiaonuo.common.pojo.CommonFile;

import java.util.List;

/**
 * 物品Mapper接口
 *
 * @author 古月墨塵
 * @date 2022/11/18 13:44
 **/
public interface BizGoodsMapper extends BaseMapper<BizGoods> {

    Page<GoodsPageResult> getPageList(Page page, @Param("dto") GoodsQryDto dto);

    int changeCabinet(@Param("list") List<GoodsInfoParam> goodsInfoParamList);

    List<CommonFile> getScrapFileList(@Param("goodsId") String goodsId);

    //存放总数
    int totalStorageNumByCabCode(@Param("cabCode") String cabCode);

    //在库数量
    int inStockNumByCabCode(@Param("cabCode") String cabCode);

    //离库数量
    int outStockNumByCabCode(@Param("cabCode") String cabCode);

    //维修数量
    int repairNumByCabCode(@Param("cabCode") String cabCode);

    //报废数量
    int scrapNumByCabCode(@Param("cabCode") String cabCode);

    //在柜报废物品
    List<BizGoods> scrapInCabinetByCabCode(@Param("cabCode") String cabCode);

    Page<ClientGoodsPageResult> pageForClient(Page<ClientGoodsPageResult> page, @Param("param") ClientGoodsQryParam param);

    ClientGoodsDetailResult getDetailForClient(@Param("goodsId") String goodsId, @Param("userId") String userId, @Param("qrCode") String qrCode);

    List<BizGoods> getListByRfids(@Param("rfids") List<String> rfids);

    //更新物品柜信息-新物品
    int updateCabInfoForNewGoodsByRfids(@Param("rfids") List<String> rfids, @Param("cabinetGroupId") String cabinetGroupId, @Param("cabinetId") String cabinetId, @Param("cabinetDoorId") String cabinetDoorId);

    //更新物品柜信息-老物品
    int updateCabInfoForGoodsByRfids(@Param("rfids") List<String> rfids, @Param("cabinetGroupId") String cabinetGroupId, @Param("cabinetId") String cabinetId, @Param("cabinetDoorId") String cabinetDoorId);

    //更新物品所属柜子信息
    int updateCabInfoForGoodsId(@Param("goodsId")String goodsId, @Param("cabinetGroupId") String cabinetGroupId, @Param("cabinetId") String cabinetId, @Param("cabinetDoorId") String cabinetDoorId);

    //更新物品借出
    int updateForLendByRfids(@Param("rfids") List<String> rfids);

    List<GoodsPageResult> getResultList(@Param("dto") GoodsQryDto dto);

    //更新物品存放一致性-老物品
    int updateStoAbcForGoodsByRfids(@Param("rfids") List<String> rfids);

    //更新物品存放一致性-老物品
    int updateToStoAbcForGoodsByRfids(@Param("rfids") List<String> rfids);

    //更新物品存放标识
    int updateEnterFlagByRfids(@Param("rfids") List<String> rfids);

    // 查询在柜的数量
    List<GoodsQuantityResult> queryInCabinetGoodsQuantity(@Param("userId") String userId, @Param("goodsType") Integer goodsType);

    // 查询离柜的数量
    List<GoodsQuantityResult> queryOutCabinetGoodsQuantity(@Param("userId") String userId, @Param("goodsType") Integer goodsType);

    // 根据条件统计柜子管理员所管理的物品总数
    long countGoodsByAdminId(@Param("userId") String userId, @Param("leaveFlag") Integer leaveFlag, @Param("state") Integer state, @Param("goodsType") Integer goodsType);

    // 统计柜子管理员所管理的在柜物品总数
    long countInGoodsByAdminId(@Param("userId") String userId, @Param("goodsType") Integer goodsType);

    // 统计柜子管理员管理的柜门总数
    long countCabinetDoorByAdmin(@Param("userId") String userId, @Param("cabinetDoorType") Integer cabinetDoorType);

    // 统计一共存放了多少试剂
    double sumReagentWeighByCabinetDoorId(@Param("cabinetDoorId") String cabinetDoorId);

    //过期试剂(在柜)
    List<BizGoods> getListForReagentOfExp();

    //根据rfid获取物品信息
    BizGoods getInfoByRfid(@Param("rfid") String rfid);

    //更新物品最后一次称重数据
    int updateLastWeigh(@Param("id")String id,@Param("weigh")String weigh,@Param("apiId")String apiId);

    //更新物品第一次称重数据
    int updateFirstWeigh(@Param("id")String id,@Param("weigh")String weigh,@Param("apiId")String apiId);

    String totalWeighInCab(@Param("cabId") String cabId);

    GoodsPageResult getInfoByQrCode(@Param("qrCode") String qrCode);

    //更新物品当前柜子信息
    int updateCabInfoForGoodsByIds(@Param("ids") List<String> ids, @Param("cabinetGroupId") String cabinetGroupId, @Param("cabinetId") String cabinetId, @Param("cabinetDoorId") String cabinetDoorId);

    //更新物品存放非一致性
    int updateStoAbcForGoodsByIds(@Param("ids") List<String> ids);

    //更新物品存放一致性
    int updateToStoAbcForGoodsByIds(@Param("ids") List<String> ids);

    List<BizGoods> getListByIds(@Param("ids") List<String> ids);

    //更新物品入库标识
    int updateEnterFlagByIds(@Param("ids") List<String> ids);

    //更新物品借出
    int updateForLendByIds(@Param("ids") List<String> ids);


    BizGoods getInfoByCode(@Param("code") String code);

    /**
     * 添加查询盘库功能-系统物品数
     * @param cabinetDoorId
     * @param cabinetInfoId
     * @return
     */
    long selectSystemCount(@Param("cabinetDoorId") String cabinetDoorId, @Param("cabinetInfoId") String cabinetInfoId);

    int updateNameByReagentClassId(@Param("goodsName") String goodsName,@Param("reagentClassId") String reagentClassId);
}
